package com.quectel.pay.module.order.service;


import com.quectel.pay.module.order.dto.PayOrderRefundDto;
import com.quectel.pay.module.order.dto.response.SendRefundResp;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author ryan
 * @date 2021-01-27 14:22:03
 */
public interface PayOrderRefundService {

    /**
     * 根据账单查询退款账单
     * @param orderId 账单id
     * @return
     */
    List<PayOrderRefundDto> selectByOrderId(Long orderId);

    /**
     * 根据退款订单查询
     *
     * @param outRefundNo
     * @return
     */
    PayOrderRefundDto selectByOutRefundNo(String outRefundNo);

    /**
     * 标记一条订单退款成功 并且更新原订单的多次退款产生的退款总金额
     *
     * @param outTradeNo        支付订单号
     * @param outRefundNo       退款订单号
     * @param refundSuccessTime 退款成功时间
     */
    void signRefundSuccess(String outTradeNo, String outRefundNo, Date refundSuccessTime);

    /**
     * 发起退款申请 如果发起成功转台会扭转为正在退款 如果正在退款中也可以再发起 正在退款再次发起需要传入退款订单号
     *
     * @param outTradeNo      订单号
     * @param outRefundNo     退款订单号 由调用者传入保证幂等性 PayOrderService.genOrderNo();
     * @param refundAmount
     * @param refundType      @see OrderRefundConstants 1自动结算2人工
     * @param refundNotifyUrl 回调url 传入null按照下单时的退款回调为准
     * @param userAccount     操作人 人工退款需要传入
     * @return
     */
    SendRefundResp sendRefundRequest(String outTradeNo,
                                     String outRefundNo,
                                     BigDecimal refundAmount,
                                     Byte refundType,
                                     String refundNotifyUrl,
                                     String userAccount);


    /**
     * 查询列表
     */
    List<PayOrderRefundDto> queryList(Map<String, Object> params);

    /**
     * 查询数量
     */
    int queryTotal(Map<String, Object> map);

    /**
     * 存入一条记录
     *
     * @param dto
     * @return 存入数据的id
     */
    Long save(PayOrderRefundDto dto);

    /**
     * 根据id更新一条记录
     *
     * @param dto
     */
    void updateById(PayOrderRefundDto dto);

    /**
     * 根据id查询一条记录
     *
     * @param id
     */
    PayOrderRefundDto selectById(Long id);

    /**
     * 根据id删除一条记录
     *
     * @param id
     */
    void deleteById(Long id);

    /**
     * 批量删除
     *
     * @param ids
     */
    void deleteBatch(Long[] ids);
}
